package com.cskaoyan.javase.oop2._1extends._7initialization._0introduction;
/**
 * 何为子类对象初始化问题?
 * 我们先复习一下我们认识引用数据类型的过程：
 * 首先我们从数组对象的初始化开始
 * 我们知道引用数据类型变量分为两个部分，在堆上创建对象，在栈中创建引用，引用通过存储地址指向堆上的对象。
 * 对象是引用数据类型的实质，但是我们不能直接访问对象，而是通过栈上的引用间接访问堆上的对象。
 * --------------------------------------------
 * 然后我们学习了对象与类的概念，引入了类加载的概念。并且使用数据类型的定义统一了引用数据类型和基本数据类型：
 * 数据类型：一组数据 + 基于数据的一组合法操作
 * 引用数据类型：成员变量的合集 + 成员方法的合集
 * 也就是说，引用数据类型（类）是特殊的数据类型，是自定义的数据类型。
 * 这种自定义的数据类型JVM不认识它，需要一个了解认识它的过程，称之为类加载。
 * 关于类加载:
 *      1.类加载是懒加载
 *      2.当程序执行到类加载的时机,某个类才会进行类加载
 *          类加载的时机:
 *          a.启动main方法
 *          b.new对象
 *          c.访问类的静态成员
 *      3.类加载某个类最多只有一次(在程序的某一次运行期间)
 *
 * JVM通过类加载了解一个类型，从而能够完成创建对象，或者其它的一些操作。
 *
 * -------------------------------------------------------------------------
 *
 * 现在我们学习了继承的概念，在继承中，子类会继承父类的成员，使用子类对象可以直接访问父类中继承过来的成员。
 * 那么问题就来了：
 *
 *   1.父类的成员从何而来？凭空出现？
 *   2.父类的成员变量也需要赋值，那么赋值顺序是怎么样的？结果是怎么样的？为什么会体现出这种特点？
 * 等等
 * 以上问题就是子类对象的初始化问题，即研究子类对象创建时，父类的成员从何而来，父类成员变量的赋值等相关的问题。
 *
 * @since 09:49
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        System.out.println(new Son().a);
    }
}
class Father{
    int a = 10;
    {
        a = 100;
    }
}
class Son extends Father{

}